#include "RingQueue.hpp"
#include "Task.hpp"
#include <pthread.h>
#include <unistd.h>
#include <ctime>

void* Consumer(void* agrs)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(agrs);
    while(1)
    {
        sleep(1);
        // 1.获取数据
        int data = 0;
        rq->Pop(&data);

        // 2.处理数据
        std::cout <<  "Consumer  -> " << data << std::endl;
    }
}

void* Productor(void* agrs)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(agrs);
    while(1)
    {
        // 1.构建数据
        int data = rand() % 10 + 1; // [1, 10]

        // 2.生产数据
        rq->Push(data);
        std::cout << "Productor -> " << data << std::endl;
    }
}

// 若是多生产多消费，环形队列的下标位置分别只有一个
// 所以生产下标和消费下标就变成的临界资源了，必须要加锁， 两把!

int main()
{
    srand(time(nullptr) ^ getpid());
    // 多多
    RingQueue<int>* rq = new RingQueue<int>(5);
    pthread_t c1, c2, p1, p2, p3;
    pthread_create(&c1, nullptr, Consumer, rq);
    pthread_create(&c2, nullptr, Consumer, rq);
    pthread_create(&p1, nullptr, Productor, rq);
    pthread_create(&p2, nullptr, Productor, rq);
    pthread_create(&p3, nullptr, Productor, rq);

    pthread_join(c1, nullptr);
    pthread_join(c2, nullptr);
    pthread_join(p1, nullptr);
    pthread_join(p2, nullptr);
    pthread_join(p3, nullptr);


    return 0;
}